package com.diy.sigmund.diycommon.designpatterns.composite;

import java.util.Iterator;

/**
 * @author ylm-sigmund
 * @since 2022/2/14 17:29
 */
public class Waitress {

    MenuComponent allMenus;

    public Waitress(MenuComponent allMenus) {
        this.allMenus = allMenus;
    }

    public void printMenu() {
        allMenus.print();
    }

    public void printVegetarianMenu() {
        Iterator<MenuComponent> iterator = allMenus.createIterator();
        while (iterator.hasNext()) {
            MenuComponent menuComponent = iterator.next();
            try {
                if (menuComponent.isVegetarian()) {
                    menuComponent.print();
                }
                // try/catch 是一种错误处理的方法而不是程序逻辑的方法
                // 1.我们可以在调用isVegetarian()之前用instanceof来检查菜单组件的运行时类型，以确定它是菜单项。
                // 但是这么做，我们就会因为无法统一处理菜单和菜单项而失去透明性。
                // 2.也可以改写Menu的isVegetarian()方法，让它返回false。
                // 但是我们真正想要传达的是：isVegetarian()是Menu没有支持的操作（这和说isVegetarian()是false意义不等同）。
                // 这样的做法也允许后来人去为Menu实现一个合理的isVegetarian()方法，而我们不必为此再修改这里的代码了。
            } catch (UnsupportedOperationException ignored) {
            }
        }
    }
}
